package com.sunday.common.netty.e2_Time;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * ByteToMessageDecoder 是 ChannelInboundHandler 的实现，它可以轻松处理碎片问题。
 */
public class TimeDecoder extends ByteToMessageDecoder { // (1)

    /**
     * 每当收到新数据时，ByteToMessageDecoder 都会使用内部维护的累积缓冲区调用该方法。decode()
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { // (2)
        if (in.readableBytes() < 4) {
            /**
             * decode()可以决定在累积缓冲区中没有足够的数据时不添加任何内容。当收到更多数据时，ByteToMessageDecoder 将再次调用。out decode()
             */
            return; // (3)
        }

        /**
         * 如果将对象添加到 ，则表示解码器已成功解码消息。ByteToMessageDecoder 将丢弃累积缓冲区的读取部分。
         * 请记住，您不需要解码多条消息。
         * ByteToMessageDecoder 将继续调用该方法，直到它不添加任何内容。decode() out decode() out
         */
        out.add(in.readBytes(4)); // (4)
    }
}

/**
 * 如果你是一个喜欢冒险的人，你可能想尝试一下ReplayingDecoder，它进一步简化了解码器。不过，您需要查阅 API 参考以获取更多信息。
 *
 * public class TimeDecoder extends ReplayingDecoder<Void> {
 *     @Override
 *     protected void decode(
 *             ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
 *         out.add(in.readBytes(4));
 *     }
 * }
 *
 * 此外，Netty提供了开箱即用的解码器，使您能够非常轻松地实现大多数协议，并帮助您避免最终实现整体式的不可维护的处理程序实现。有关更详细的示例，请参阅以下软件包：
 *
 * io.netty.example.factorial，以及
 * io.netty.example.telnet，用于基于文本行的协议。
 */
